Ribbon负载均衡

	简介

        Spring Cloud Ribbon是一个基于HTTP和TCP的'客户端负载均衡工具'，它基于 Netflix Ribbon 实现。
		通过 Spring Cloud 的封装，可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
		
		Spring Cloud Ribbon虽然只是一个工具类框架，它不像服务注册中心、配置中心、API网关那样需要独立部署，
		但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用，API网关的请求转发等内容，
		实际上都是通过 Ribbon 来实现的，包括后续我们将要介绍的 Feign，它也是基于 Ribbon 实现的工具。
		所以，对于 Spring Cloud Ribbon 的理解和使用，对于我们使用 Spring Cloud 来构建微服务非常重要。

		Ribbon的客户端组件提供一系列完整的配置项如:连接超时、重试等等。简单来说，就是在配置文件中列出 LoadBalancer(简称:LB(负载均衡))
		后面所有的机器，Ribbon会自动帮你基于某种规则(如简单轮询、随机连接等等)去连接这些机器。我们也很容易使用 Ribbon 实现自定义的负载均衡算法！

	负载均衡

		1.概述

			负载均衡简单来说就是用户的请求平摊的分配到多个服务上，从而达到系统的HA(高可用)。

		2.负载均衡简单分类

			集中式LB

				即在服务的消费方和提供方之间使用独立的LB设施，如Nginx:反向代理服务器！由设施负责把访问请求通过某种策略转发至服务的提供方！

			进程式LB

				将LB逻辑集成到消费方，消费方从服务注册中心获知哪有地址可用，然后自己再从这些地址中选出合适的服务器。
				'Ribbon 就属于进程式LB'，它只是一个类库，集成于消费方进程，消费方通过它来获取服务提供方的地址。

	常见的负载均衡软件

		LVS(Linux 虚拟服务器):LVS是Linux Virtual Server的简写，意即Linux虚拟服务器，是一个虚拟的服务器集群系统。
							 本项目在1998年5月由章文嵩博士成立，是中国国内最早出现的自由软件项目之一。

		Nginx:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器，同时也提供了IMAP/POP3/SMTP服务。
			  Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点（俄文：Рамблер）开发的，第一个公开版本0.1.0发布于2004年10月4日。

		.
		.
		.
		.

		Dubbo、SpringCloud 中均给我们提供了负载均衡，SpringCloud 的负载均衡算法还可以自定义。

	负载均衡算法自定义

		IRule.class 查看接口:

		自带的负载均衡策略:
		AvailabilityFilteringRule:先过滤掉，跳闸或者访问故障的服务，对剩下的服务进行轮询
		RoundRobinRule:轮询
		RandomRule:随机
		WeightedResponseTimeRule:权重
		RetryRule:重试(先按照轮询获取服务，如果服务获取失败就会在指定时间内进行重试)
		.
		.
		.

		自定义负载均衡策略:
		在不与运行类同级的地方建立新的目录
		编写策略配置类@Configuration 并注入@Bean 
		 @Bean
		    public IRule myRule() {
		        return new LinRandomRule();
		    }

		 在Return new 出自己编写的自定义的负载均衡策略
		 然后在SpringBootApplication运行类加入注解
		 @RibbonClient(name = 服务名称 ,configuration = 自定义策略配置类.class)


		详解策略:
		Ribbon的负载均衡策略有：
		策略类　　								命名	描述
		
		RandomRule								随机策略	随机选择server
		RoundRobinRule(默认负载均衡算法)			轮询策略	轮询选择， 轮询index，选择index对应位置的Server；
		RetryRule								重试策略	对选定的负载均衡策略机上重试机制，在一个配置时间段内当选择Server不成功，则一直尝试使用subRule的方式选择一个可用的server；
		BestAvailableRule						最低并发策略	逐个考察server，如果server断路器打开，则忽略，再选择其中并发链接最低的server
		AvailabilityFilteringRule				可用过滤策略	过滤掉一直失败并被标记为circuit tripped的server，过滤掉那些高并发链接的server（active connections超过配置的阈值）或者使用一个AvailabilityPredicate来包含过滤server的逻辑，其实就就是检查status里记录的各个Server的运行状态；
		ResponseTimeWeightedRule				响应时间加权重策略	根据server的响应时间分配权重，响应时间越长，权重越低，被选择到的概率也就越低。响应时间越短，权重越高，被选中的概率越高，这个策略很贴切，综合了各种因素，比如：网络，磁盘，io等，都直接影响响应时间
		ZoneAvoidanceRule						区域权重策略	综合判断server所在区域的性能，和server的可用性，轮询选择server并且判断一个AWS Zone的运行性能是否可用，剔除不可用的Zone中的所有server

	Ribbon 部署

		1.导入依赖包

		<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-ribbon</artifactId>
		    <version>1.4.6.RELEASE</version>
		</dependency>

		2.配置文件

		配合 Eureka 使用
		# Eureka配置
		eureka:
		  client:
		    register-with-eureka: false
		    service-url:
		      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

		3.注解的使用
		
		@LoadBalanced // 配置负载均衡实现RestTemplate

		4.策略选择 

		@Bean
	    public IRule myRule(){
	        return new RandomRule();
	    }

	    5.服务提供地址的获取

	    //    通过Ribbon去实现负载均衡的时候，这里要取服务的地址变量就不能是一个常量，而要是一个变量,
		//    那个这个变量的值也不再是一个指定的地址,而服务的名字,访问方式从地址访问变成服务id访问
		//    private static final String REST_URL_PREFIX = "http://localhost:8001";
		      private static final String REST_URL_PREFIX = "http://SpringCloud-provider-dept";